define(function(require, exports){
	var $ = require('jquery');
	var pubjs = require('pubjs');
	var util = require('util');
	var view  = require('@base/view');

	// 包含排除的单个内容模块
	var Single = view.container.extend({
		init: function( config ) {
			config = pubjs.conf( config, {
				'class': '',
				'single': false, // 是否只能加一组(区别重定向和人群,重定向不能有且的关系,故只能添加一组)
				'url': '', // 树形模块选项卡数据拉取地址
				'method': 'websocket',
				'tplFile': '/tpl/modules/inEx.html',
				'title': null, // 顶部标题，null则影藏head
				'view_model': {
					'showTitle': false, // 显示标题
					'title': '',  // 标题
					'showCreateBtn': true, // 是否显示增加条件组按钮
					'addAnds': this.eventAddAnds, // 添加一个大类条件(且)
					'itemRemove': this.eventItemRemove,  // 监听移除事件，判断是否影藏添加按钮
					'items': [],     // 条件数组(且关系)
					'orItems': [],   // 包含条件里的条件数组(或关系)
					'editOr': this.eventEditOr
				}
			});

			var c = config.get();
			c.view_model.title = c.title || '';

			this.$treeDataReady = false; // 树形模块是否创建完成
			this.$treeSets = null; // setValue值
			this.$data = null;
			this.Super('init', arguments);
		},
		afterBuild: function(){

			this.buildFromTemplate({
				// 滚动条
				'scroller': {
					'dir': 'V',
					'watch': 350
				},
				// 条件选择窗口
				'popwin': {
					'target': pubjs.DEFAULT_POPUP_CONTAINER,
					'param': {
						'method': this.getConfig('method')
					},
					'layout': {
						'module': '@base/dialog.base',
						'mask': 1,
						'title': LANG('添加条件'),
						'showFoot': true,
						// 'width': 895,
						// 'height': 580,
						'silence': false,
						'size': 'm'
					}
				}
			});

		},
		afterBuildTemplate: function(){
			if(util.isMobile()){
				this.getDOM().find('.M-inExConBoxInclude').css('overflow-y', 'auto');
				if(this.$.scroller){
					this.$.scroller.destroy();
				}
			}
		},
		// 检查是否需要显示添加按钮
		checkSingle: function() {
			var single = this.getConfig('single');
			var vm = this.vm.$;
			vm['showCreateBtn'] = !single || vm.items.length < 1;
		},
		// 添加一条大条件(且)
		eventAddAnds: function() {
			var C = this.getConfig();
			var popwin = this.$.popwin;
			this.$index = -1;
			if (!this.$data) {
				popwin
				.reset()
				.load( C.url )
				.show();
			} else {
				popwin.reset().show();
			}
			return false;
		},
		// 编辑一条小条件(或)
		eventEditOr: function( index ) {
			var items = this.vm.getItem('items') || [];
			this.$treeSets = items[index]['orItems'];
			var popwin = this.$.popwin;
			this.$index = index;
			if( this.$treeDataReady ) {
				this.showTreeSeted();
			} else if (!this.$data){
				popwin.load( this.getConfig('url') );
			}
		},
		eventItemRemove: function( index ){
			var vm = this.vm.$;
			var items = vm['items'];
			if(items.length){
				items[0].text = '';
			}
			this.checkSingle();
		},
		// 监听弹窗里的树数据加载完成
		onTreePopDataLoaded: function( ev ) {
			this.$treeDataReady = true;
			// 编辑状态下才setValue
			if( this.$index !== -1 ) {
				this.showTreeSeted();
			}
			return false;
		},
		// 弹窗内容选中
		onTreeSelected: function( ev ) {
			var selectedArr = ev.param; // 选中的项
			var len = selectedArr.length;
			var vm = this.vm.$;
			var items = [];
			this.$.popwin.hide();
			items = vm['items'];
			// 添加大条件
			if( this.$index === -1 ) {
				var txt = items.length === 0 ? '' : LANG('且');
				items.push({
					'orItems': selectedArr,
					'text': txt
				});
				// 检查是否只允许单组
				this.checkSingle();
			}
			// 编辑小条件
			else {
				// 选择空数组时直接删掉
				if( len === 0 ) {
					this.removeOneInArr( items, this.$index );
				}
				else {
					items[this.$index]['orItems'] = selectedArr;
				}
			}
			return false;
		},
		// 显示树模块的选中状态
		showTreeSeted: function( sets ) {
			var popwin = this.$.popwin;
			popwin
			.reset()
			.setValue( this.$treeSets )
			.show();
		},
		// 删除数组中的一个元素
		removeOneInArr: function( arr, index ) {
			arr.splice( index, 1 );
		},
		setData: function( data ) {
			this.$treeDataReady = true;
			this.$data = data;
			this.$.popwin.reset().setData(data);
			return this;
		},
		getValue: function() {
			var data = [];
			var items = this.vm.getItem('items') || [];

			util.each(items, function(item) {
				data.push( _getFiledsInArray( item['orItems'] ) );
			});
			return data;
		},
		setValue: function( data ) {
			var vm = this.vm.$;
			var formatData = [];

			util.each(data, function(item) {
				formatData.push({
					'orItems': item,
					'text': LANG('且')
				});
			});

			if (formatData[0]) {
				formatData[0]['text'] = '';
			}

			vm['items'] = formatData;
			//检查是否需要显示添加按钮
			this.checkSingle();

			return this;
		},
		reset: function() {
			this.$data = null;
			this.$treeSets = null;
			this.$treeDataReady = false;
			this.vm.reset();
			return this;
		}
	});
	exports.single = Single;

	// 包含排除模块
	var InEx = view.container.extend({
		init: function( config ) {
			config = pubjs.conf( config, {
				'class': 'M-inEx',
				'single': false, // 是否只能加一组(区别重定向和人群,重定向不能有且的关系,故只能添加一组)
				'url': '',   // 树形模块选项卡数据拉取地址
				'param': '', // 数据参数
				'auto_load': false,
				'method': 'websocket'
			});
			this.Super('init', arguments);
		},
		afterBuild: function(){
			var c = this.getConfig();
			var el = this.getDOM();

			el.addClass('clearBox');
			var con = $('<di class="M-inExCon fl pr"></di>').appendTo(el);
			this.$loadingEl = $('<div class="M-tableListLoading bottom-right">').appendTo(con);

			this.create('ins', Single, {
				'target': con,
				'title': LANG("包含以下人群"),
				'class': 'fl mr20',
				'single': c.single
			});

			this.create('exs', Single, {
				'target': con,
				'title': LANG("排除以下人群"),
				'class': 'fl',
				'single': c.single
			});

			this.reset();
		},
		setParam: function(param) {
			this.$param = param;
			return this;
		},
		load: function() {
			var c = this.getConfig();
			var param = util.extend({}, c.param, this.$param);
			if (c.auto_load) {
				pubjs.sync();
			}
			this.showLoading();
			pubjs.mc.send(c.url, param, this.onData.bind(this));
			return this;
		},
		onData: function(err, data) {
			var c = this.getConfig();
			this.hideLoading();

			if (c.auto_load) {
				pubjs.sync(true);
			}
			if (err) {
				return pubjs.alert(err.message);
			}
			this.setData(data);
		},
		showLoading: function() {
			this.$loadingEl.show();
			return this;
		},
		hideLoading: function() {
			this.$loadingEl.hide();
			return this;
		},
		setData: function(data) {
			this.$data = data;
			this.$.ins.setData(data);
			this.$.exs.setData(data);
			return this;
		},
		getValue: function() {
			return {
				'Include': this.$.ins.getValue(),
				'Exclude': this.$.exs.getValue()
			}
		},
		setValue: function( data ) {
			var ins = data['Include'] || [];
			var exs = data['Exclude'] || [];

			this.$.ins.setValue(ins);
			this.$.exs.setValue(exs);

			return this;
		},
		reset: function() {
			this.hideLoading();
			this.$param = {};
			this.$.ins.reset();
			this.$.exs.reset();
			return this;
		}
	});
	exports.base = InEx;

	// 取出数组中元素的id和text字段,返回新数组
	function _getFiledsInArray( arr ) {
		var retArr = [], i = 0, len = arr.length;
		for( ; i < len; i++ ) {
			retArr.push({
				'id': arr[i]['id'],
				'text': arr[i]['text']
			});
		}
		return retArr;
	}
});